# tf2.0版本
import tensorflow as tf
import numpy as np
import timeit
"""
在TensorFlow2.0 中默认是开启eager Execution的
Eager Execution 是一种命令式得变成，和原生的python是一直的当你执行某个操作的时候可立即返回结果

graph模式
1.0 采用的就是静态图模式，也就是先构建一个计算图，然后需要开启session，输入实际的数据才能真正执行得到结果
Eager Execution 更容易debug，但是代码执行效率低
x = tf.ones((2, 2), dtype=tf.dtypes.float32)
y = tf.constant([[1, 2], [3, 4]], dtype=tf.dtypes.float32)

z = tf.matmul(x, y)

"""




"""
autoGraph

通过tf.function装饰器注解函数，可以像任何函数一样调用它，他会被编译成图，这意味着可以获得更高效的在gpu或者TPU上运行，此时函数变成了TensorFlow中的operation
但是在graph模式下执行的时候是无法查看其中变量数值的
"""
@tf.function
def sample_nn_layer(w, x, b):
    """
    返回结果为：
    Tensor("b:0", shape=(), dtype=float32)
    该结果表明无法查看方法内的数据
    矩阵 (w * x) + b
    :param w: 入参1
    :param x: 入参2
    :param b: 入参3
    :return:
    """
    print(b)
    return tf.nn.relu(tf.matmul(w, x) + b)

w = tf.random.uniform((3, 3))
x = tf.random.uniform((3, 3))
b = tf.constant(0.5, dtype="float32")

sample_nn_layer(w, x, b)

"""
2维
卷积核100
卷积核是2*2的
步长是1*1的

"""
CNN_cell = tf.keras.layers.Conv2D(filters=100, kernel_size=2, strides=(1, 1))

@tf.function
def CNN_fn(image):
    return CNN_cell(image)

image = tf.zeros([100,200,200,3])

CNN_cell(image)
CNN_fn(image)

print("eager",timeit.timeit(lambda :CNN_cell(image),number=10))
print("graph",timeit.timeit(lambda :CNN_fn(image),number=10))
